from rest_framework import serializers
from django_redis import get_redis_connection
from redis import RedisError
import logging

logging = logging.getLogger('meiduo')

#选择ModelSerializer 和 Serializer 的区别
#1.ModelSerializer 自动生成了字段
#2.ModelSerializer  自动生成了 create和update方法
#3.ModelSerializer  必须有Model（模型）

#图片验证 ，uuid
#没有模型
class RegisterSmscodeSerializer(serializers.Serializer):
    text = serializers.CharField(label='图片验证码',max_length=4,min_length=4,required=True)
    image_code_id = serializers.UUIDField(label='uuid')

    #序列化器在进行验证的时候至少有4种方案
    #1.字段类型： uuidfield
    #2.字段选项： max_length=4
    #3.单个字段效验： def valide_字段名
    #4.多个字段名： def validate

    # def validate_text(self,value):
    #
    #     # 图片验证码比较 是比较用户提交的 和 redis中
    #     # redis中的图片需要通过 image_code_id 获取
    #     # 这个函数中没有 iamge_code_id 所以 需要在多个字段的函数中进行验证
    #
    #     # 为什么返回呢? 因为 用户肯定有输入正确的时候,必须把正确的数据返回
    #     return value


    def validate(self,data):
        #attrs就是data
        #1.获取用户提交的
        text = data.get('text')
        image_code_id = data.get('image_code_id')
        #2.获取redis中的数据
        redis_conn = get_redis_connection('code')
        redis_text = redis_conn.get('img_%s'%image_code_id)

        #判断获取的redis_text的值
        if redis_text is None:
            raise serializers.ValidationError('图片验证码已经过期')

        #我们已近获取到了 redis 中的图片验证码，我们可以删除
        #redis 内存
        try:
            redis_conn.delete('img_%s'%image_code_id)
        except RedisError as e:
            logging.error(e)

        #3.比较
        #注意点 redis的数据是 bytes类型
        if redis_text.decode().lower() != text.lower():
            raise serializers.ValidationError('图片验证码输入错误')

        return data
